package com.example.springmall.interceptor;

import com.example.springmall.exception.ForbiddenException;
import com.example.springmall.mapper.SysPermissionMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

@Component
@RequiredArgsConstructor
public class PermissionInterceptor implements HandlerInterceptor {

    private final SysPermissionMapper permissionMapper;
    private final AntPathMatcher pathMatcher = new AntPathMatcher(); //Spring 提供的一个路径匹配工具类，支持使用 Ant 风格的路径模式进行匹配。

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 1. 获取当前请求的URL和方法
        String requestURI = request.getRequestURI(); // 请求路径，如：'/goods/list', '/goods/12'
        String method = request.getMethod();// 请求方法，如：'GET'

        // 2. 获取当前用户ID
        Long userId = Long.valueOf(request.getAttribute("userId").toString());//  当前用户ID，如：1

        // 3. 获取用户的所有权限
        List<String> permissions = permissionMapper.getUserPermissions(userId); // 查询当前用户的权限，  如：['/goods/{id}:GET']

        // 4. 检查是否有权限访问
        boolean hasPermission = hasPermission(permissions, requestURI, method);

        if (!hasPermission) {
            throw new ForbiddenException("没有权限访问该接口");
        }

        return true;//权限校验通过，放行
    }

    private boolean hasPermission(List<String> userPermissions, String requestURI, String method) {
        // 遍历用户权限列表 ； userPermissions
        // 拆分 /goods/list:GET    /goods/list      GET
        // 分别与请求地址requestURI和请求方法method比对
        //  如果比对都一致：那就放行，返回true
        //  如果比对出现任何一个不一致：那就拦截下来，返回false

        // 遍历用户权限列表
        for (String permission : userPermissions) {
            String[] parts = permission.split(":"); // 拆分权限字符串
            if (parts.length != 2) {
                continue; // 如果格式不正确，跳过当前权限字符串
            }

            String a = parts[0]; // 请求路径
            String b = parts[1]; // 请求方法 GET get Get

            // 比对请求路径和请求方法
            if (    pathMatcher.match(a, requestURI)   //    /goods/list == /goods/list         /goods/99 == /goods/{id}  true
                    &&
                    method.equalsIgnoreCase(b) //不区分大小写，判断字符是否一致  Get==GET   get == Get
            ) {

                return true; // 如果匹配成功，返回true
            }
        }

        return false; // 如果遍历完都没有匹配成功，返回false
    }

} 